package lock;

/**
 * ReentrantLock(重入锁)
 * 公平锁
 */

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;

public class ReentrantLockDemo4 implements Runnable {
    //声明一把锁，其中ReentrantLock（可重入的互斥锁）是Lock接口的一个实现
    public static ReentrantLock lock = new ReentrantLock(true);

    @Override
    public void run() {
        while (true) {
            try {
                lock.lock();
                System.out.println(Thread.currentThread().getName() + "，获得锁");
            } finally {
                lock.unlock();
            }
        }
    }

    public static void main(String[] args) throws InterruptedException {
        ReentrantLockDemo4 fairLock = new ReentrantLockDemo4();
        Thread thread1 = new Thread(fairLock, "线程1");
        Thread thread2 = new Thread(fairLock, "线程2");
        thread1.start();
        thread2.start();
    }

}

/*
修改重入锁是否公平，观察输出结果，如果公平，输出结果始终为两个线程交替的获得锁，如果是非公平，输出结果为一个线程占用锁很长时间，然后才会释放锁，另个线程才能执行。
 ??引出第二个问题：为什么公平锁例子中出现，公平锁线程是不断切换的，而非公平锁出现同一线程连续获取锁的情况？
 */